<?php

declare (strict_types=1);

namespace randy\tools\units;

/**
 * 常用数组扩展
 * Class ExtendArray
 *
 * @package utils
 */
class ExtendArray
{
    /**
     * 移除一维数组指定键值
     *
     * @param array $array
     * @param array $keys
     *
     * @return array
     * @author : Randy_chen
     * @Date   : 2020/4/22
     * @Time   : 13:31
     */
    static function removeKeys(array $array, array $keys)
    {
        return array_diff_key($array, array_flip($keys));
    }

    /**
     * 二维数据按照某个字段排序
     *
     * @param array  $array
     * @param string $keys
     * @param int    $sort
     *
     * @return mixed
     * @author : Randy_chen
     * @Date   : 2020/4/20
     * @Time   : 15:15
     */
    static function arraySort(array $array, string $keys, int $sort = SORT_DESC) : array
    {
        $keysValue = [];
        foreach ($array as $k => $v) {
            $keysValue[$k] = $v[$keys];
        }
        array_multisort($keysValue, $sort, $array);
        return $array;
    }

    /**
     * 获取二维数组指定多列
     *
     * @param array $input       //原数组
     * @param array $column_keys //指定key数组
     *
     * @return array
     * @author : Randy_chen
     * @Date   : 2020/4/20
     * @Time   : 15:23
     */
    static function arrayColumns(array $input, array $column_keys = []) : array
    {
        $result = [];
        foreach ($input as $v) {
            $tmp = self::newOnlyKeys($v, $column_keys);
            $result[] = $tmp;
        }
        return $result;
    }

    /**
     * 获取一维数组指定key
     *
     * @param array $array
     * @param array $keys
     *
     * @return array
     * @author : Randy_chen
     * @Date   : 2020/4/22
     * @Time   : 13:32
     */
    static function newOnlyKeys(array $array, array $keys) : array
    {
        return array_intersect_key($array, array_flip($keys));
    }

    /*
    * $sourceArr 原来的数组
    * $key 主键
    * $parentKey 与主键关联的父主键
    * $childrenKey 生成的孩子的键名
    *
    */

    static function listToTree($list, $pk = 'id', $pid = 'pid', $child = 'children', $root = 0) : array
    {
        $tree = [];
        if (is_array($list)) {
            $refer = [];
            foreach ($list as $key => $data) {
                $refer[$data[$pk]] = &$data;
            }

            foreach ($list as $key => $data) {
                // 判断是否存在parent
                $parentId = $data[$pid];

                if ($root == $parentId) {
                    $tree[$data[$pk]] = &$data;
                } else {
                    if (isset($refer[$parentId])) {
                        $parent = &$refer[$parentId];
                        $parent[$child][$data[$pk]] = &$list[$key];

                        $parent[$child] = array_values($parent[$child]);
                    }
                }
            }
        }
        return $tree;
    }
}